#include "Lista.h"

//inicializa lista
void inicializa(Lista * Milista){
  Milista->tam = 0;
  Milista->Cabeza = NULL;
  Milista->Colita = NULL;
}

//adentro debe tener el entero que quieres dentro de la caja
Cajita *crearCaja(int adentro){
        Cajita *nueva;
        nueva = (Cajita *) malloc(sizeof(Cajita));
        nueva->siguiente = NULL;
        nueva->anterior = NULL;
        nueva->cosa = adentro;
        return nueva;
}

//Inserta la cajita al final
void insertarColita(Cajita *nuevo, Lista *Milista){
        nuevo->siguiente = NULL;
        nuevo->anterior = Milista->Colita;
	if(Milista->Colita != NULL){
	  (Milista->Colita)->siguiente = nuevo;
	}
        Milista->Colita = nuevo;
        if(Milista->Cabeza == NULL){
                Milista->Cabeza = nuevo;
        }
        (Milista->tam)++;
}

//Inserta la cajita al principio
void insertarCabeza(Cajita *nuevo, Lista *Milista){
        nuevo->anterior = NULL;
        nuevo->siguiente = Milista->Cabeza;
        if(Milista->Cabeza != NULL){
	  (Milista->Cabeza)->anterior = nuevo;
	}
        Milista->Cabeza = nuevo;
        if(Milista->Colita == NULL){
                Milista->Colita = nuevo;
        }
        (Milista->tam)++;
}

//Eliminar la cajita del principio
void eliminarCabeza(Lista *Milista){
        Cajita *afuera;
        afuera = Milista->Cabeza;
        Milista->Cabeza = afuera->siguiente;
	if(Milista->Cabeza != NULL){
	  (Milista->Cabeza)->anterior = NULL;
	}
	if(afuera != NULL){
	  free(afuera);
	  (Milista->tam)--;
	}
}

//Eliminar la cajita de la colita
void eliminarColita(Lista *Milista){
        Cajita *afuera;
        afuera = Milista->Colita;
        Milista->Colita = afuera->anterior;
        if (Milista->Colita != NULL) {
        	(Milista->Colita)->siguiente = NULL;
        }
        free(afuera);
        (Milista->tam)--;
}

int desencolar(Lista * Milista){
  int res = Milista->Cabeza->cosa;
  eliminarCabeza(Milista);
  return res;
}

void push(int valor, Lista *Milista){
  Cajita* new = crearCaja(valor);
  insertarColita(new, Milista);
}

int pop(Lista *Milista){
  int res = Milista->Colita->cosa;
  eliminarColita(Milista);
  return res;
}
int tam(Lista *Milista){
        return Milista->tam;

}

//Se inserta cajita en pos (contando desde la cabeza y desde posicion cero).
// Regresa -1 si hubo error, sino regresa 0.
int insertarEn(Cajita *nuevo, int pos,Lista *Milista){
        Cajita *Buscador = Milista->Cabeza;
        int i;
        if (pos == 0){
                insertarCabeza(nuevo, Milista);
                return 0;
        }
        for(i=0;i<pos;i++){
            if(Buscador == NULL){ 
                return -1;
            }
            if(Buscador->siguiente == NULL && pos == i+1){ 
                insertarColita(nuevo, Milista); 
                return 0;
            }
            Buscador = Buscador->siguiente;
        }
        nuevo->siguiente = Buscador;
        nuevo->anterior = Buscador->anterior;
        (Buscador->anterior)->siguiente = nuevo;
        Buscador->anterior = nuevo;
        (Milista->tam)++;
        
}





        
        

